package com.vegetable.modules.controller.finance;

import com.alibaba.fastjson.JSONObject;
import com.vegetable.common.annotation.SysLog;
import com.vegetable.common.utils.R;
import com.vegetable.modules.controller.AbstractController;
import com.vegetable.modules.entity.baseData.FundAccount;
import com.vegetable.modules.service.baseData.IFundAccountService;
import com.vegetable.modules.service.finance.FinancialAnalysisWxPushService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 财务分析企业微信推送控制器
 *
 * @author Qoder
 */
@Slf4j
@RestController
@RequestMapping("/financial/wx")
@AllArgsConstructor
@Api(value = "财务分析企业微信推送", tags = "财务分析企业微信推送")
public class FinancialAnalysisWxController extends AbstractController {

    private final IFundAccountService fundAccountService;
    private final FinancialAnalysisWxPushService financialAnalysisWxPushService;

    /**
     * 推送财务分析数据到企业微信用户（文本形式）
     */
    @SysLog(value = "推送财务分析数据到企业微信（文本）")
    @PostMapping("/pushAnalysis")
    @ApiOperation(value = "推送财务分析数据到企业微信用户（文本形式）", notes = "将指定时间段的财务分析数据推送到指定的企业微信用户（文本形式）")
    public R<Boolean> pushFinancialAnalysisToWxUser(
            @RequestParam Integer chartRange,
            @RequestParam String wxUserId) {
        try {
            log.info("开始推送财务分析数据到企业微信用户: {}, 时间范围: {}个月", wxUserId, chartRange);
            
            // 获取财务分析数据
            R financialAnalysisResult = fundAccountService.financialAnalysis(chartRange);
            if (financialAnalysisResult.getCode() != 0) {
                return R.fail("获取财务分析数据失败: " + financialAnalysisResult.getMsg());
            }
            
            JSONObject financialData = (JSONObject) financialAnalysisResult.getData();
            
            // 推送到企业微信
            boolean result = financialAnalysisWxPushService.pushFinancialAnalysisToWxUser(financialData, wxUserId);
            
            if (result) {
                log.info("财务分析数据推送成功: 用户ID {}", wxUserId);
                return R.success("财务分析数据推送成功");
            } else {
                log.error("财务分析数据推送失败: 用户ID {}", wxUserId);
                return R.fail("财务分析数据推送失败");
            }
        } catch (Exception e) {
            log.error("推送财务分析数据到企业微信时发生异常", e);
            return R.fail("推送过程中发生异常: " + e.getMessage());
        }
    }

    /**
     * 推送财务分析数据到企业微信用户（Markdown形式）
     */
    @SysLog(value = "推送财务分析数据到企业微信（Markdown）")
    @PostMapping("/pushAnalysisMarkdown")
    @ApiOperation(value = "推送财务分析数据到企业微信用户（Markdown形式）", notes = "将指定时间段的财务分析数据推送到指定的企业微信用户（Markdown形式）")
    public R<Boolean> pushFinancialAnalysisMarkdownToWxUser(
            @RequestParam Integer chartRange,
            @RequestParam String wxUserId) {
        try {
            log.info("开始推送财务分析数据到企业微信用户: {}, 时间范围: {}个月", wxUserId, chartRange);
            
            // 获取财务分析数据
            R financialAnalysisResult = fundAccountService.financialAnalysis(chartRange);
            if (financialAnalysisResult.getCode() != 0) {
                return R.fail("获取财务分析数据失败: " + financialAnalysisResult.getMsg());
            }
            
            JSONObject financialData = (JSONObject) financialAnalysisResult.getData();
            
            // 推送到企业微信
            boolean result = financialAnalysisWxPushService.pushFinancialAnalysisMarkdownToWxUser(financialData, wxUserId);
            
            if (result) {
                log.info("财务分析Markdown数据推送成功: 用户ID {}", wxUserId);
                return R.success("财务分析Markdown数据推送成功");
            } else {
                log.error("财务分析Markdown数据推送失败: 用户ID {}", wxUserId);
                return R.fail("财务分析Markdown数据推送失败");
            }
        } catch (Exception e) {
            log.error("推送财务分析Markdown数据到企业微信时发生异常", e);
            return R.fail("推送过程中发生异常: " + e.getMessage());
        }
    }

    /**
     * 推送财务分析数据到企业微信用户（图文形式）
     */
    @SysLog(value = "推送财务分析数据到企业微信（图文）")
    @PostMapping("/pushAnalysisChart")
    @ApiOperation(value = "推送财务分析数据到企业微信用户（图文形式）", notes = "将指定时间段的财务分析数据推送到指定的企业微信用户（图文形式）")
    public R<Boolean> pushFinancialAnalysisChartToWxUser(
            @RequestParam Integer chartRange,
            @RequestParam String wxUserId) {
        try {
            log.info("开始推送财务分析图表数据到企业微信用户: {}, 时间范围: {}个月", wxUserId, chartRange);
            
            // 获取财务分析数据
            R financialAnalysisResult = fundAccountService.financialAnalysis(chartRange);
            if (financialAnalysisResult.getCode() != 0) {
                return R.fail("获取财务分析数据失败: " + financialAnalysisResult.getMsg());
            }
            
            JSONObject financialData = (JSONObject) financialAnalysisResult.getData();
            
            // 推送到企业微信
            boolean result = financialAnalysisWxPushService.pushFinancialAnalysisChartToWxUser(financialData, wxUserId);
            
            if (result) {
                log.info("财务分析图表数据推送成功: 用户ID {}", wxUserId);
                return R.success("财务分析图表数据推送成功");
            } else {
                log.error("财务分析图表数据推送失败: 用户ID {}", wxUserId);
                return R.fail("财务分析图表数据推送失败");
            }
        } catch (Exception e) {
            log.error("推送财务分析图表数据到企业微信时发生异常", e);
            return R.fail("推送过程中发生异常: " + e.getMessage());
        }
    }

    /**
     * 获取财务分析数据（供测试使用）
     */
    @SysLog(value = "获取财务分析数据")
    @GetMapping("/financialAnalysis")
    @ApiOperation(value = "获取财务分析数据", notes = "获取指定时间段的财务分析数据")
    public R financialAnalysis(@RequestParam Integer chartRange) {
        log.info("获取财务分析数据，时间范围: {}个月", chartRange);
        return fundAccountService.financialAnalysis(chartRange);
    }
}